package control;

import java.awt.Color;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.Date;

import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.DateTickUnitType;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.data.gantt.Task;
import org.jfree.data.gantt.TaskSeries;
import org.jfree.data.gantt.TaskSeriesCollection;

import service.ProjetoService;
import util.DateUtil;
import entity.Atividade;
import entity.Iteracao;
import entity.Periodo;
import exception.AlmiranteException;

@Named
@SessionScoped
public class GerarGanttControl implements Serializable {
	private static final long serialVersionUID = -4793899905211664035L;

	@EJB
	private ProjetoService projetoService;

	private Long idIteracao;
	
	private Iteracao iteracao;
	
	public void gerar(OutputStream out, Object data) {
		if (idIteracao != null) {			
			try {
				iteracao = projetoService.obterIteracaoComAtividadesERecursos(idIteracao);
				
				if (iteracao != null && !iteracao.getAtividades().isEmpty()) {
					int qtdDiasGrafico = new Periodo(iteracao.getInicio(), DateUtil.somaDias(iteracao.getFim(), 1)).intervaloEmDias();
					
					TaskSeries estimado = new TaskSeries("Estimado");
					TaskSeries realizado = new TaskSeries("Realizado");
					
					estimado.add(new Task("Iteração " + iteracao.getNumero(), iteracao.getInicio(), DateUtil.somaDias(iteracao.getFim(), 1)));
					
					if (iteracao.getInicioRealizado() != null && iteracao.getFimRealizado() != null) {
						realizado.add(new Task("Iteração " + iteracao.getNumero(), iteracao.getInicio(), DateUtil.somaDias(iteracao.getFimRealizado(), 1)));
						int qtdDiasRealizados = new Periodo(iteracao.getInicioRealizado(), DateUtil.somaDias(iteracao.getFimRealizado(), 1)).intervaloEmDias();
						if (qtdDiasRealizados > qtdDiasGrafico) {
							qtdDiasGrafico = qtdDiasRealizados;
						}
					}
					
					for (Atividade atividade : iteracao.getAtividades()) {
						String nomeAtividade = atividade.getNome() != null ? atividade.getNome() : "";
						Task task = new Task(atividade.getNumero() + " - " + nomeAtividade, 
								atividade.getInicioEstimado(), DateUtil.somaDias(atividade.getFimEstimado(), 1));
						estimado.add(task);
						
						// realizado
						if (atividade.getInicioRealizado() != null) {
							Task taskRealizado = new Task(atividade.getNumero() + " - " + nomeAtividade, 
									atividade.getInicioRealizado(), DateUtil.somaDias(atividade.getFimRealizado(), 1));
							
							realizado.add(taskRealizado);
						}
					}
					TaskSeriesCollection taskCollection = new TaskSeriesCollection();
					taskCollection.add(estimado);
					taskCollection.add(realizado);
					
					JFreeChart chart = ChartFactory.createGanttChart("", "Atividades", "Datas", taskCollection, true, true, false);
					
					CategoryPlot plot = chart.getCategoryPlot();
					plot.getRenderer().setSeriesPaint(0, Color.BLUE);
					DateAxis axis = (DateAxis) plot.getRangeAxis();
					axis.setTickUnit(new DateTickUnit(DateTickUnitType.DAY, 7));
					
					int qtdTasks = estimado.getItemCount() + realizado.getItemCount();
					ChartUtilities.writeChartAsJPEG(out, chart, (qtdDiasGrafico * 20) + 150, 
							(qtdTasks * 25) + 90);
				}
			} catch (AlmiranteException ae) {
				throw ae;
			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		}
	}
	
	public Long getIdIteracao() {
		return idIteracao;
	}
	
	public void setIdIteracao(Long idIteracao) {
		this.idIteracao = idIteracao;
	}

	public Date getDataHora() {
		return new Date();
	}
}
